﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using OcenyOpisowe.Controllers;

namespace OcenyOpisowe
{
	/// <summary>
	/// Atrybut pozwalający na udostępnienie funkcjonalności automatycznego mapowania wartości 
	/// pobranych z entity framework na obiekty modelu widoku.
	/// </summary>
	[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
	public class AutoMapAttribute : ActionFilterAttribute
	{
		/// <summary>
		/// Typ, z którego bedziemy mapować.
		/// </summary>
		private Type SourceType { get; set; }
		/// <summary>
		/// Typ, na który będziemy mapować.
		/// </summary>
		private Type DestType { get; set; }
		
		/// <summary>
		/// Inicjuje instancję atrybutu podanymi typami.
		/// Typy te informują o kierunku mapowania danych.
		/// </summary>
		/// <param name="sourceType">Typ, z którego bedziemy mapować.</param>
		/// <param name="destType">Typ, na który będziemy mapować.</param>
		public AutoMapAttribute(Type sourceType, Type destType)
		{
			SourceType = sourceType;
			DestType = destType;
		}

		/// <summary>
		/// Wywoływane w momencie wykonywania akcji kontrollera wykorzystującego ten atrybut.
		/// </summary>
		/// <param name="filterContext">Kontekst, w którym akcja kontrolera została wywołana.</param>
		public override void OnActionExecuted(ActionExecutedContext filterContext)
		{
			base.OnActionExecuted(filterContext);
			var controller = filterContext.Controller as IModelMapperController;
			if (controller == null)
			{
				return;
			}
			var model = filterContext.Controller.ViewData.Model;
			if (model != null && SourceType.IsAssignableFrom(model.GetType()))
			{
				var viewModel = controller.ModelMapper.Map(model, SourceType, DestType);
				filterContext.Controller.ViewData.Model = viewModel;
			}
		}
	}
}